package baidu;

import java.util.*;
/**
 * @author zc
 * @version 1.0
 * @date 2021/9/7 16:26
 *
 * https://www.nowcoder.com/questionTerminal/427268b254234d1eabfbd9a6844ba896
 */
public class Main {
    public static class Node{
        public List<Node> parents = new ArrayList<>();      //未通过的测试用例发现一个节点可以有多个父亲，故用链表存节点的父亲
        public List<Node> kids = new ArrayList<>();         //尽管按照测试用例貌似一个节点只有一个儿子，但是用链表存不会错
        public int outNum = 0;                              //另开个整型存节点出度，如果用List.size()之类方法更新很麻烦
        public int inNum = 0;                               //节点入度
        boolean flag = true;                                //节点是否已被删除
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int count = n;
        int storey = 1;
        int[] res = new int[n];
        Node[] nodes = new Node[n];
        //开数组存n个节点
        for(int i = 0; i < n; ++i){
            Node node = new Node();
            nodes[i] = node;
        }
        //根据后续读入行更新节点入度出度、父节点子节点
        while(sc.hasNext()){
            int from = sc.nextInt();
            int to = sc.nextInt();
            nodes[from-1].outNum++;
            nodes[to-1].inNum++;
            nodes[from-1].kids.add(nodes[to-1]);
            nodes[to-1].parents.add(nodes[from-1]);
        }

        //count控制是否已删除所有节点
        while(count > 0){
            List<Node> levelNode = new ArrayList<>();       //存这层删除的节点，必须在for循环遍历后再去50行的levelNode遍历里更新，否则一边删一边更新会删除后面层的节点
            for( int i = 0; i < n; ++i){
                //入度+出度不大于1就该删除，并且用flag判断是否已删除过，防止重复给结果赋值
                if((nodes[i].outNum + nodes[i].inNum) <= 1 && nodes[i].flag){
                    res[i] = storey;
                    nodes[i].flag = false;
                    levelNode.add(nodes[i]);        //将被删除的节点加入链表，在后面的遍历里更新
                    count--;                        //循环结束条件更新，即剩余未删除的节点数
                }
            }
            //将这层删除的节点的关联节点的数据更新
            for(Node node : levelNode){
                for(Node parent : node.parents)
                    parent.outNum--;
                for(Node kid : node.kids)
                    kid.inNum--;
            }
            storey++;       //层数加一
        }
        //求第几次被删除    其实就是在从下往上数第几层。
        for( int i = 0; i < n-1; ++i){
            System.out.print(res[i]+" ");
        }
        System.out.print(res[n-1]);
    }
}
